package customValidator

import (
	"github.com/go-playground/validator/v10"
	"go.uber.org/zap"
	. "go_tempate/SQL/table"
)

// 注册数据验证
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
func SecurityRemoveDuplicates(fl validator.FieldLevel) bool {
	// 获取切片的值
	slice := fl.Field().Interface()

	//获取解析后的数据
	newSlice := slice.([]UserSecurity)

	//去重验证map
	reductionMap := make(map[uint]bool)

	// 遍历切片中的每个元素，检查是否有重复元素
	//----------------------------------------------------------------------------------------------------------
	for _, v := range newSlice {
		//进行基础的格式+是否存在验证
		//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
		if v.Answer == "" || v.SecurityTypeId == 0 || len(v.Answer) > 12 {
			zap.S().Error("新增用户密保问题验证格式不符合规范")
			return false
		}

		//声明密保问题列表，进行查询是否存在这些密保问题
		security := SecurityType{}
		if err := security.QuerySecurity(v.SecurityTypeId); err != nil {
			zap.S().Error("查询新增用户密保问题是否存在库中失败")
			return false
		}

		if security.Name == "" {
			zap.S().Error("密保问题表中不存在此新增的插入的密保内容")
			return false
		}

		//判断去重map中是否有此时的密保问题ID
		//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
		if reductionMap[v.SecurityTypeId] {
			//有的话直接抛出错误
			return false
		}

		//没有的话对其进行赋值
		//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
		reductionMap[v.SecurityTypeId] = true
	}

	//循环完成都没有抛出错误则进行验证通过
	//----------------------------------------------------------------------------------------------------------
	return true
}
